package gbench.appdemo.priceline.indicator;

import static gbench.common.tree.LittleTree.MFT;
import static gbench.common.tree.LittleTree.CronTime.ldt2dt;

import java.time.LocalDateTime;
import java.util.stream.Stream;

import gbench.common.tree.LittleTree.IRecord;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * Ｋ线节点，是价格线的基本构成单位/单元，为一个统计数据结构：
 * Ｏpen,High,Low,Close,Volume的５个字段数据．
 * 
 * @author gbench
 *
 */
@Data@Builder@NoArgsConstructor@AllArgsConstructor
public class OHLC implements IPriceIndicator{
    
    /**
     * 数据格式化
     */
    public String toString() {
        return MFT("{0,date,yyy-MM-dd HH:mm:ss},O{1,number,#}H{2,number,#}L{3,number,#}C{4,number,#}V{5,number,#}",
            ldt2dt(time),open,high,close,low,volume) ;
    }
    
    /**
     * OHLC
     * @param rec 初始值
     */
    public OHLC(IRecord rec) {
        Stream.of(this.getClass().getDeclaredFields()).forEach(fld -> {
            String key = fld.getName();
            try {
                fld.set(this, IRecord.obj2target(rec.get(key), fld.getType()));
            }catch(Exception e) {
                // do nothing
            }// try
        });// forEach
    }
    
    double open; // 开盘价格
    double high; // 最高价格
    double low; // 最低价格
    double close; // 收盘价格
    long volume; // 收盘量能
    private long volume0; // 初始化交易量（开盘量能)
    LocalDateTime time; // 更新的时间
    
    /**
     * 下标索引，一般为null，表示数据在更新的时候没有产生跨期。所谓跨期就是(1分钟线):
     * 00:01:15的秒的数据，出现在00:02:01之后，即第一分钟的数据，出现在了第二分钟。
     */
    Long index;// K线的索引。即时间周期的分组序号1分钟线：[0:00,00:59) 序号为1,[1:00,1:59)需要为2，依次类推。
}